add stubhub agent

Ryan Loomba 11 years ago
parent
commit
052c3b31ec
1 changed files with 105 additions and 0 deletions
  1. 105 0
      app/models/agents/stubhub_agent.rb

+ 105 - 0
app/models/agents/stubhub_agent.rb

@@ -0,0 +1,105 @@
1
+module Agents
2
+  class StubhubAgent < Agent
3
+    cannot_receive_events!
4
+
5
+    description <<-MD
6
+      This StubHubAgent creates an event for a given StubHub Event. It can be used to track how many tickets are available for the event and the minimum and maximum price. All that is required is that you paste in the url from the actual event, e.g. http://www.stubhub.com/outside-lands-music-festival-tickets/outside-lands-music-festival-3-day-pass-san-francisco-golden-gate-park-polo-fields-8-8-2014-9020701/
7
+    MD
8
+
9
+    event_description <<-MD
10
+      Events looks like this:
11
+        {
12
+          "url": "http://stubhub.com/valid-event-url"
13
+          "name": "Event Name"
14
+          "date": "2014-08-01"
15
+          "max_price": "999.99"
16
+          "min_price": "100.99"
17
+          "total_postings": "50"
18
+          "total_tickets": "150"
19
+          "venue_name": "Venue Name"
20
+        }
21
+    MD
22
+
23
+    default_schedule "every_1d"
24
+
25
+    def working?
26
+      event_created_within?(1) && !recent_error_logs?
27
+    end
28
+
29
+    def default_options
30
+      { 'url' =>  'http://stubhub.com/enter-your-event-here' }
31
+    end
32
+
33
+    def validate_options
34
+      errors.add(:base, 'url is required') unless options['url'].present?
35
+    end
36
+
37
+    def url
38
+      options['url']
39
+    end
40
+
41
+    def check
42
+      create_event :payload => fetch_stubhub_data(url)
43
+    end
44
+
45
+    def fetch_stubhub_data(url)
46
+      begin
47
+        StubhubFetcher.call(url)
48
+      rescue
49
+        log("There was an error fetching data for your StubHub Event")
50
+      end
51
+    end
52
+
53
+    class StubhubFetcher
54
+
55
+      def self.call(url)
56
+        new(url).fields
57
+
58
+      end
59
+
60
+      def initialize(url)
61
+        @url = url
62
+      end
63
+
64
+      def event_id
65
+        /(\d*)\/{0,1}\z/.match(url)[1]
66
+      end
67
+
68
+      def base_url
69
+       'http://www.stubhub.com/listingCatalog/select/?q='
70
+      end
71
+
72
+      def build_url
73
+        base_url + "%2B+stubhubDocumentType%3Aevent%0D%0A%2B+event_id%3A#{event_id}%0D%0A&start=0&rows=10&wt=json"
74
+      end
75
+
76
+      def response
77
+        uri = URI(build_url)
78
+        Net::HTTP.get(uri)
79
+      end
80
+
81
+      def parse_response
82
+        JSON.parse(response)
83
+      end
84
+
85
+      def fields
86
+        stubhub_fields = parse_response['response']['docs'][0]
87
+        {
88
+          'url' => url,
89
+          'name' => stubhub_fields['seo_description_en_US'],
90
+          'date' => stubhub_fields['event_date_local'],
91
+          'max_price' => stubhub_fields['maxPrice'].to_s,
92
+          'min_price' => stubhub_fields['minPrice'].to_s,
93
+          'total_postings' => stubhub_fields['totalPostings'].to_s,
94
+          'total_tickets' => stubhub_fields['totalTickets'].to_i.to_s,
95
+          'venue_name' => stubhub_fields['venue_name']
96
+        }
97
+      end
98
+
99
+      private
100
+
101
+      attr_reader :url
102
+
103
+    end
104
+  end
105
+end